Spring Boot ํ ์คํธ ์ฝ๋ ์์ฑํ๊ธฐ: JUnit 5์ Mockito ํ์ฉ ๊ฐ์ด๋
๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ์ ํ ์คํธ ์ฝ๋์ ๋๋ค. ๋จ์ํ "์ฝ๋๊ฐ ๋์๊ฐ๋ ๊ฒ"์ ๋์ด, ์๋ํ ๋๋ก ๋์ํจ์ ๊ฒ์ฆํ๊ณ ๋ฆฌํฉํ ๋ง์ ์์ ๋ง์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค. 2026๋ ๊ธฐ์ค ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ JUnit 5์ Mockito๋ฅผ ์ค์ฌ์ผ๋ก ์ดํด๋ด ๋๋ค.
1. ํ ์คํธ์ ์ข ๋ฅ
- ๋จ์ ํ ์คํธ(Unit Test): ํ๋์ ๋ฉ์๋๋ ํด๋์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํฉ๋๋ค. ์ธ๋ถ ์์กด์ฑ(DB ๋ฑ)์ ๊ฐ์ง ๊ฐ์ฒด(Mock)๋ก ๋์ฒดํ์ฌ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์คํ๋ฉ๋๋ค.
- ํตํฉ ํ ์คํธ(Integration Test): ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ค์ ๋ก ๋์ ์ฌ๋ฌ ์ปดํฌ๋ํธ ๊ฐ์ ์ํธ์์ฉ์ ํ ์คํธํฉ๋๋ค. ์ค์ DB ์ฐ๋๊น์ง ๊ฒ์ฆํฉ๋๋ค.
2. ๋จ์ ํ ์คํธ ์์ฑํ๊ธฐ (Mockito ํ์ฉ)
์๋น์ค ๋ ์ด์ด๋ฅผ ํ ์คํธํ ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๊ฐ์ฒด(Repository)๋ฅผ ๊ฐ์ง๋ก ๋ง๋ค์ด ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํฉ๋๋ค.
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
@DisplayName("ํ์ ๊ฐ์
์ฑ๊ณต ํ
์คํธ")
void join_Success() {
// given (์ค๋น)
User user = new User("ํ๊ธธ๋", "[email protected]");
given(userRepository.save(any())).willReturn(user);
// when (์คํ)
Long savedId = userService.join(user);
// then (๊ฒ์ฆ)
assertThat(savedId).isNotNull();
verify(userRepository, times(1)).save(any());
}
}3. ํตํฉ ํ ์คํธ ์์ฑํ๊ธฐ (@SpringBootTest)
API ์ปจํธ๋กค๋ฌ๋ถํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊น์ง ์ ์ฒด ํ๋ฆ์ ํ ์คํธํฉ๋๋ค.
@SpringBootTest
@AutoConfigureMockMvc
@Transactional // ํ
์คํธ ํ ๋ฐ์ดํฐ ๋กค๋ฐฑ
class UserApiTest {
@Autowired
private MockMvc mockMvc;
@Test
@DisplayName("API๋ฅผ ํตํ ์ฌ์ฉ์ ์กฐํ ํ
์คํธ")
void getUser_ApiTest() throws Exception {
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("ํ๊ธธ๋"));
}
}4. ์ข์ ํ ์คํธ ์ฝ๋๋ฅผ ์ํ ์์น (F.I.R.S.T)
- Fast (๋น ๋ฅด๊ฒ): ํ ์คํธ๋ ์์ฃผ ์คํ๋์ด์ผ ํ๋ฏ๋ก ๋นจ๋ผ์ผ ํฉ๋๋ค.
- Independent (๋ ๋ฆฝ์ ์ผ๋ก): ๊ฐ ํ ์คํธ๋ ์๋ก ์์กดํ์ง ์๊ณ ๋จ๋ ์ผ๋ก ์คํ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
- Repeatable (๋ฐ๋ณต ๊ฐ๋ฅํ๊ฒ): ์ด๋ค ํ๊ฒฝ์์๋ ๊ฒฐ๊ณผ๊ฐ ํญ์ ๊ฐ์์ผ ํฉ๋๋ค.
- Self-Validating (์๊ฐ ๊ฒ์ฆ): ์ฑ๊ณต/์คํจ ์ฌ๋ถ๋ฅผ ์ฝ๋๊ฐ ์ง์ ์๋ ค์ค์ผ ํฉ๋๋ค.
- Timely (์ ์์): ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ์ง์ ์ด๋ ์งํ์ ์์ฑํด์ผ ํฉ๋๋ค.
5. ๊ฒฐ๋ก
ํ ์คํธ ์ฝ๋๋ ์์ฑํ ๋๋ ๋ฒ๊ฑฐ๋กญ์ง๋ง, ์ฅ๊ธฐ์ ์ผ๋ก๋ ๋ฒ๊ทธ ์์ ๋น์ฉ์ ํ๊ธฐ์ ์ผ๋ก ๋ฎ์ถฐ์ค๋๋ค. ํนํ **TDD(ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ)**๋ฅผ ์ค์ฒํด๋ณด๋ฉฐ ์ฝ๋์ ํ์ง์ ๋์ฌ๋ณด์ธ์!